package com.zzyl.service.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.google.common.collect.Lists;
import com.zzyl.base.PageResponse;
import com.zzyl.constant.SuperConstant;
import com.zzyl.dto.UserDto;
import com.zzyl.entity.User;
import com.zzyl.entity.UserRole;
import com.zzyl.enums.BasicEnum;
import com.zzyl.exception.BaseException;
import com.zzyl.mapper.DeptMapper;
import com.zzyl.mapper.RoleMapper;
import com.zzyl.mapper.UserMapper;
import com.zzyl.mapper.UserRoleMapper;
import com.zzyl.service.UserService;
import com.zzyl.vo.UserVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @author     ：zhangheng
 * @date       ：Created in 2024/9/4 10:53
 * @description：用户添加
 * @modified By：
 * @version: 1.0
 */
@Service
public class UserServiceImpI implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private RoleMapper roleMapper;
    @Autowired
    private UserRoleMapper userRoleMapper;
    @Autowired
    private DeptMapper deptMapper;
    @Override
    public PageResponse<UserVo> fingUserVoPage(UserDto userDto, Integer pageNum, Integer pageSize) {
        //开始分页查询
        PageHelper.startPage(pageNum,pageSize);
        //调用slectPage对象返回page对象
        Page<UserVo> page =userMapper.selectPage(userDto);
        //把page封装为需要的返回值
        PageResponse <UserVo> pageResponse= PageResponse.of(page, UserVo.class);
        //输出
        return pageResponse;
    }

//新建用户
    @Override
    @Transactional
    public UserVo createRole(UserDto userDto) {
        //调用isLowestDept(UserDto.getDepNo（）)方法判断输入的部门编号是否是最底层的部门，如果是最低层的部门，则抛出异常，不允许添加用户
             if (isLowestDept(userDto.getDeptNo())){
              throw new BaseException(BasicEnum.USER_LOCATED_BOTTOMED_DEPT);
             }
        //使用Bean Util.同Bean（userDto,user.class）将UserDto对象转化为User对象
        User user = BeanUtil.toBean(userDto, User.class);
        //设置用户的名字、昵称、数据状态和密码。其中。用户设置为用户的电子邮件。昵称设置为用户的真实姓名，数据状态设置为0；（表示正常），密码设置为”123456“
        user.setUsername(user.getEmail());
        user.setNickName(user.getRealName());
        user.setDataState(SuperConstant.DATA_STATE_0);
        user.setPassword("123456");
         //将用户信息插入数据库中。如果插入失败（返回值为0）抛出异常
        int flag=userMapper.insert(user);
        if (flag==0){
            throw new RuntimeException("保存用户信息出错");
        }
      List<UserRole> userRoles = Lists.newArrayList();
        userDto.getRoleVoIds().forEach(r->{
            userRoles.add(UserRole.builder()
                    .userId(user.getId())
                    .roleId(Long.valueOf(r))
                    .dataState(SuperConstant.DATA_STATE_0)
                    .build());
        });
        flag=userRoleMapper.batchInsert(userRoles);
        if (flag==0){
            throw new RuntimeException("保存用户角色中间表出错");
        }
        //处理用户角色的关联关系表。接下来，处理用户角色的关联关系。首先创建一个UserRole列表，然后遍历userDto中的roleVoIds，为每个角色创建一个UserRole对象，并将其添加到列表中。最后，调用userRoleMapper.batchInsert(userRoles)批量插入用户角色关联关系。如果插入失败（返回值为0），则抛出异常。
        //将User对象转换为UserVo对象并返回。
        return BeanUtil.toBean(user,UserVo.class);
    }

    private boolean isLowestDept(String deptNo) {
        int count = deptMapper.isLowestDept(deptNo);
        if (count>0){
            return true;
        }
        return false;
    }
    //修改用户
    @Override
    public Boolean updateUser(UserDto userDto) {
//首先，调用isLowestDept(userDto.getDeptNo())方法判断输入的部门编号是否是最底层的部门。如果是最底层的部门，则抛出异常，不允许修改用户信息。
        if (isLowestDept(userDto.getDeptNo())){
           throw new BaseException(BasicEnum.USER_LOCATED_BOTTOMED_DEPT);
        }
//使用BeanUtil.toBean(userDto, User.class)将UserDto对象转换为User对象。
        User user = BeanUtil.toBean(userDto, User.class);
        user.setUsername(userDto.getEmail());
        int flag = userMapper.updateByPrimaryKeySelective(user);
        if (flag==0){
            throw new RuntimeException("修改用户信息出错");
        }
        if (CollUtil.isNotEmpty(userDto.getRoleVoIds())){
            //删除中间表
           boolean flagDel= userRoleMapper.deleteUserRoleByUseld(user.getId());
           if (!flagDel){
               throw  new RuntimeException("删除中间表失败");
           }
           //重新保存角色中间表
            List<UserRole> userRoles = Lists.newArrayList();
           userDto.getRoleVoIds().forEach(r->{
               userRoles.add(UserRole.builder()
                               .userId(user.getId())
                               .roleId(Long.valueOf(r))
                               .dataState(SuperConstant.DATA_STATE_0)
                       .build());
           });
           flag = userRoleMapper.batchInsert(userRoles);
           if (flag==0){
               throw  new RuntimeException("保存角色中间表出错");
           }
        }
//设置用户的用户名为用户的电子邮件。
//调用userMapper.updateByPrimaryKeySelective(user)更新用户信息到数据库中。如果更新失败（返回值为0），则抛出异常。
//如果userDto中的roleVoIds不为空，则执行以下操作： a. 调用userRoleMapper.deleteUserRoleByUserId(user.getId())删除当前用户的所有角色关联关系。如果删除失败，则抛出异常。
// b. 重新创建UserRole列表，遍历userDto中的roleVoIds，为每个角色创建一个UserRole对象，并将其添加到列表中。
// c. 调用userRoleMapper.batchInsert(userRoles)批量插入新的用户角色关联关系。如果插入失败（返回值为0），则抛出异常。

        return true;
    }
//启用禁用用户

    @Override
    public void isEnable(Long id, String status) {
        User user = userMapper.selectByPrimaryKey(id);
        if (user==null){
            throw new BaseException(BasicEnum.USER_EMPTY_EXCEPTION);
        }
        user.setDataState(status);
        userMapper.updateByPrimaryKeySelective(user);
    }
    //列表显示用户

    @Override
    public List<UserVo> userList(UserDto userDto) {
            List<UserVo> userList=userMapper.selectList(userDto);
          return  BeanUtil.copyToList(userList,UserVo.class);
    }

//删除用户

    @Override
    public void removeUser(Long userIds) {
        //删除与用户关联的角色表
       userRoleMapper.deleteUserRoleByUseld(userIds);
        //删除与用户相关的岗位表
        userMapper.deleteByPrimaryKey(userIds);
    }
}

